package logger

import (
	"fmt"
	"os"
	"path/filepath"

	"health-check/internal/config"
	"health-check/internal/identity"

	ixLog "gitee.com/ixgo/log"
)

var (
	// Logger 全局日志实例
	Logger ixLog.Logger
)

// InitLogger 初始化日志器
func InitLogger(cfg *config.LoggingConfig) error {
	// 初始化服务器标识
	identity.InitServerIdentity()

	// 设置日志级别
	level, err := ixLog.ParseLevelFromString(cfg.Level)
	if err != nil {
		level = ixLog.INFO
	}

	// 创建配置选项
	var options []ixLog.ConfigOption
	options = append(options, ixLog.WithLevel(level))

	// 设置输出格式
	if cfg.Format == "json" {
		options = append(options, ixLog.WithFormat(ixLog.JSONFormat))
	}

	// 设置输出目标
	if cfg.Output == "file" {
		// 确保日志目录存在
		logDir := filepath.Dir(cfg.FilePath)
		if err := os.MkdirAll(logDir, 0755); err != nil {
			return fmt.Errorf("创建日志目录失败: %v", err)
		}

		options = append(options, ixLog.WithFileOutput(cfg.FilePath))
	}

	// 创建日志器
	Logger, err = ixLog.NewLogger(options...)
	if err != nil {
		return fmt.Errorf("创建日志器失败: %v", err)
	}

	// 设置默认字段
	Logger = Logger.WithField("server", identity.GetServerID()).
		WithField("host", identity.GetHostname()).
		WithField("ip", identity.GetIP())

	return nil
}

// GetLogger 获取日志器实例
func GetLogger() ixLog.Logger {
	if Logger == nil {
		// 如果未初始化，使用默认配置
		cfg := &config.LoggingConfig{
			Level:  "info",
			Format: "text",
			Output: "stdout",
		}
		if err := InitLogger(cfg); err != nil {
			// 如果初始化失败，使用默认的简单日志器
			Logger = ixLog.Quick()
		}
	}
	return Logger
}

// Debug 记录调试日志
func Debug(args ...interface{}) {
	GetLogger().Debug(args...)
}

// Debugf 记录格式化调试日志
func Debugf(format string, args ...interface{}) {
	GetLogger().Debugf(format, args...)
}

// Info 记录信息日志
func Info(args ...interface{}) {
	GetLogger().Info(args...)
}

// Infof 记录格式化信息日志
func Infof(format string, args ...interface{}) {
	GetLogger().Infof(format, args...)
}

// Warn 记录警告日志
func Warn(args ...interface{}) {
	GetLogger().Warn(args...)
}

// Warnf 记录格式化警告日志
func Warnf(format string, args ...interface{}) {
	GetLogger().Warnf(format, args...)
}

// Error 记录错误日志
func Error(args ...interface{}) {
	GetLogger().Error(args...)
}

// Errorf 记录格式化错误日志
func Errorf(format string, args ...interface{}) {
	GetLogger().Errorf(format, args...)
}

// Fatal 记录致命错误日志并退出
func Fatal(args ...interface{}) {
	GetLogger().Fatal(args...)
}

// Fatalf 记录格式化致命错误日志并退出
func Fatalf(format string, args ...interface{}) {
	GetLogger().Fatalf(format, args...)
}

// WithField 创建带字段的日志器
func WithField(key string, value interface{}) ixLog.Logger {
	return GetLogger().WithFields(map[string]interface{}{key: value})
}

// WithFields 创建带多个字段的日志器
func WithFields(fields map[string]interface{}) ixLog.Logger {
	return GetLogger().WithFields(fields)
}
